package main

import (
	"fmt"
	"reflect"
)

func main() {
	//run1()
	//run2()
	//run3()
	run4()
}

func run1() {
	var a int
	typeOfA := reflect.TypeOf(a)
	fmt.Println(typeOfA.Name(), typeOfA.Kind())
}

type Enum int

const (
	Zero Enum = 0
)

//Struct Type
func run2() {
	//声明一个空结构体
	type Cat struct{}
	//获取结构体实例的反射类型对象
	typeOfCat := reflect.TypeOf(Cat{})
	//显示反射类型对象的名称和种类
	fmt.Println(typeOfCat.Name(), typeOfCat.Kind())
	//获取Zero常量的方式类型对象
	typeOfA := reflect.TypeOf(Zero)
	fmt.Println(typeOfA.Name(), typeOfA.Kind())
}

//Ptr 类型
func run3() {
	//声明一个结构体
	type cat struct{}
	// 创建cat的实例
	ins := &cat{}
	typeOfCat := reflect.TypeOf(ins)
	// 显示繁琐类型对象的名称和种类
	fmt.Printf("name :'%v' kind:'%v'\n", typeOfCat.Name(), typeOfCat.Kind())
	//取类型的元素
	typeOfCat = typeOfCat.Elem()
	fmt.Printf("element name:'%v', element kind : '%v'", typeOfCat.Name(), typeOfCat.Kind())
}

func run4() {
	type cat struct {
		Name string
		Type int `json:"type" id:"100"`
	}
	typeOfCat := reflect.TypeOf(cat{})
	if catType, ok := typeOfCat.FieldByName("Type"); ok {
		fmt.Println(catType.Tag.Get("json"), catType.Tag.Get("id"))
	}
}
